home *** CD-ROM | disk | FTP | other *** search
/ JCSM Shareware Collection 1993 November / JCSM Shareware Collection - 1993-11.iso / cl720 / qbnws23j.lzh / FUSION.BAS < prev    next >
BASIC Source File  |  1991-05-14  |  48KB  |  953 lines

  1. '+==========================================================================+
  2. '|                               FUSION.BAS                                 |
  3. '|                              Version  1.3                                |
  4. '|                   Copyright (c) 1991, Lawrence Stone                     |
  5. '|                           All Rights Reserved                            |
  6. '|                                                                          |
  7. '|   THIS CODE IS FREE FOR USE AND MODIFICATION UNDER THESE STIPULATIONS:   |
  8. '|                                                                          |
  9. '|          1.  You are not allowed to modify this and the following        |
  10. '|              text that explain the development of this program and       |
  11. '|              the names of people who freely supplied routines that       |
  12. '|              constitute this program.                                    |
  13. '|                                                                          |
  14. '|          2.  You cannot charge any fee for this program or any program   |
  15. '|              that is principally comprised from this code, other than    |
  16. '|              a modest disk fee.                                          |
  17. '|                                                                          |
  18. '|          3.  All contibuting authors involved with the development of    |
  19. '|              this program must be credited in the opening sceen of this  |
  20. '|              program or any program that is essentially composed of the  |
  21. '|              routines derived from this program (Since you didn't pay    |
  22. '|              for it, you might as well give credit where credit is due). |
  23. '|                                                                          |
  24. '|          4.  If you modify this routine, you must include a subsequent   |
  25. '|              block of text containing your name and your modifications,  |
  26. '|              and, you must include your name in the opening screen.      |
  27. '|              (Give yourself a pat on your back.)                         |
  28. '|                                                                          |
  29. '+==========================================================================+
  30. '|                                                                          |
  31. '|                          DESCRIPTION / HISTORY                           |
  32. '|                                                                          |
  33. '|  FUSION.BAS produces up to two kaleidoscopic designs per screen.  Each   |
  34. '|  design is produced by a complex algorithm originally developed and      |
  35. '|  published by Charles Graham in his program, ENERGY12.BAS.               |
  36. '|                                                                          |
  37. '|  I re-wrote Charles' routine to include random color, music played from  |
  38. '|  a background que, random arcs with random aspect ratios, and styled     |
  39. '|  lines using the style% variable with the LINE statement.  I also have   |
  40. '|  included a routine that reads the ROM character table and positions     |
  41. '|  text characters at any pixel coordinates specified.  This routine also  |
  42. '|  can create separate background colors for displayed character strings.  |
  43. '|  The algorithm for this routine was originally published in PC Magazine  |
  44. '|  and posted as a message on the Quik_BAS international echo by Richard   |
  45. '|  Randell.  I have modified it as a subroutine called, "PrintROMtable"    |
  46. '|  and have expanded the algorithm to include shadows.                     |
  47. '|                                                                          |
  48. '|  The program has, essentially, four logical parts.  At the top of the    |
  49. '|  code, the monitor is error trapped for EGA/VGA capabilities, then a     |
  50. '|  tiled background is drawn, orbs are drawn followed by the title (via a  |
  51. '|  call to "ShowTitle"), followed by credit displays (printed via the sub- |
  52. '|  program, "PrintROMtable"), and finally, initiation of key trapping,     |
  53. '|  variable and background music.                                          |
  54. '|                                                                          |
  55. '|  The second logical area is the main logic where weighted random numbers |
  56. '|  determine how many elements each drawing will have, pixel locations for |
  57. '|  each point of each drawing, color to use for each line or arc, whether  |
  58. '|  sound is on or off, and whether to display "energy" lines, "plasma"     |
  59. '|  lines, or, "muon" or "quark" trails.                                    |
  60. '|                                                                          |
  61. '|  The third area contains subroutines which handle, color, music, screen  |
  62. '|  clearing, as well as, the number of pictures to display at once and     |
  63. '|  what palette to work with.                                              |
  64. '|                                                                          |
  65. '|  The fourth area has the subprograms "PrintROMtable" and "ShowTitle".    |
  66. '|  ShowTitle simply restores the data beginning at the label, "ProgTitle"  |
  67. '|  then, reads the data, drawing one line at a time with a style% mask off |
  68. '|  (&HFFFF) then redraws this same line with mask set.  This produces an   |
  69. '|  interesting effect of a wood like grain to the display and, due to      |
  70. '|  the number of READs, the title seems to drip onto the screen.  The      |
  71. '|  ShowTitle routine also shadows the title as it draws it.                |
  72. '|                                                                          |
  73. '|  Another major addition to Charles' routine was the inclusion of true    |
  74. '|  background music while the extensive calculations are being performed   |
  75. '|  for the designs.  The background music is the William Tell Overture,    |
  76. '|  who's author is unknown.  Whoever took the time to put William Tell to  |
  77. '|  a series of PLAY command, the whole world owes you a hearty, "Thanks".  |
  78. '|                                                                          |
  79. '|  The "+/-"  and "Color" commands used in the original ENERGY program     |
  80. '|  (Charles' program) have been removed.  These command keys were removed  |
  81. '|  because pitch command, "+/-", seemed unnecessary because FUSION includes|
  82. '|  "The William Tell Overture", and color is now randomly produced.  The   |
  83. '|  spacebar now is used to hold the screen image until the ESC key is      |
  84. '|  depressed.                                                              |
  85. '|                                                                          |
  86. '|  FUSION will cease playing The William Tell Overture while drawing       |
  87. '|  designs if, real-time, random ("spacenik") sounds, are "On".  Spacenik  |
  88. '|  sounds (as coined by Charles Graham) can be toggled "Off" by pressing   |
  89. '|  the F2 key.  It is your choice to listen to the sounds and music.  You  |
  90. '|  can select one or the other or, both or, none by pressing F1 and F2.    |
  91. '|                                                                          |
  92. '|  If "music" is "On" and "Spacenik Sound" is "Off" then the William Tell  |
  93. '|  Overture plays continuously - even while drawing a design!              |
  94. '|                                                                          |
  95. '|  The bottom line of the screen is the prompt line.  It tells you the     |
  96. '|  status of "Music" (On/Off) and "Spacenik sound" (On/Off).  The prompt   |
  97. '|  also informs you to use F1, F2 to toggle music/sound, press spacebar to |
  98. '|  hold a screen image, and press F10 to end the program.  When the space- |
  99. '|  bar is pressed, the prompt informs you to press "Esc" to compute and/or |
  100. '|  display next drawing.                                                   |
  101. '|                                                                          |
  102. '|  The use of "real" music, "spacenik" sounds, "energy", "plasma", "muons" |
  103. '|  and "quarks" result in a FUSION of the classical and contemporary that  |
  104. '|  will provide hours of enjoyment.  In the words of Charles Graham, "Grab |
  105. '|  a glass of wine, turn off the lights and ENJOY!"                        |
  106. '|                                                                          |
  107. '|  Requires an EGA or VGA monitor capable of a 640 x 350 or, 640 x 480     |
  108. '|  color graphics resolution.                                              |
  109. '|                                                                          |
  110. '+==========================================================================+
  111. '|                                                                          |
  112. '|                          TECHNICAL INFORMATION                           |
  113. '|                                                                          |
  114. '|  The algorithm developed by Charles Graham and used by FUSION to create  |
  115. '|  the "plasma" and "energy" designs is based upon the polar equation for  |
  116. '|  an ellipse where the pole is at the center, 'a' and 'b' are the semi-   |
  117. '|  axes, 'r' is the radius and theta is the angle in radians:              |
  118. '|                                                                          |
  119. '|                                    2         2                           |
  120. '|               2                   a         b                            |
  121. '|              r    =    ----------------------------------                |
  122. '|                         2     2              2    2                      |
  123. '|                        a   SIN  theta   -   b  SIN  theta                |
  124. '|                                                                          |
  125. '+==========================================================================+
  126. '|                                                                          |
  127. '|                         CONTACTING THE AUTHORS                           |
  128. '|                                                                          |
  129. '|  Any donation to the authors as a way for you to say, "thank you", is    |
  130. '|  readily accepted.  However, the authors will not accept a donation if   |
  131. '|  in excess of $10,000 <GRIN>.  Seriously, questions and suggestions can  |
  132. '|  be addressed to:                                                        |
  133. '|                                                                          |
  134. '|          Larry Stone             Author of FUSION.                       |
  135. '|          P.O. Box 5715                                                   |
  136. '|          Charleston, OR  97420                                           |
  137. '|                                                                          |
  138. '|          Charles Graham          Author of the algorithm to plot and     |
  139. '|          P.O. Box 58634          display the designs derived by the      |
  140. '|          St. Louis, MO  63158    polor equations for each ellipse        |
  141. '|                                  generated by weighted, random points.   |
  142. '|                                                                          |
  143. '|          Anonymous               The unknown hacker that actually took   |
  144. '|          Address Unknown         the time to put the William Tell Over-  |
  145. '|                                  ture to code.  This unknown tone master |
  146. '|                                  mailed his work to Ethan Winer with a   |
  147. '|                                  set of instructions to share with the   |
  148. '|                                  world.  Ethan did.  Charles and I have. |
  149. '|                                  Now, what about you?                    |
  150. '|                                                                          |
  151. '+--------------------------------------------------------------------------+
  152.  
  153. '+==========================================================================+
  154. '| QB Compile :   bc fusion/E/X/V/W/O/T/C:512;                              |
  155. '| QB Link    :   link /EX fusion;                                          |
  156. '|                                                                          |
  157. '| PDS Compile:   bc fusion/E/X/V/O/Ot/Lr/FPi/Es/T/C:512;                   |
  158. '| PDS Link   :   link /EX/NOE fusion+NOCGA+NOHERC+SMALLERR,,nul,BCL71ENR;  |
  159. '+--------------------------------------------------------------------------+
  160.  
  161. '+==========================================================================+
  162. '|                              Declarations                                |
  163. '+--------------------------------------------------------------------------+
  164.  
  165. DECLARE SUB PrintROMtable (a$, x%, y%, StepX%, StepY%, CO%, BackGround%, Shadow%)
  166. DECLARE SUB ShowTitle (BeginLine%)
  167.  
  168. CONST False = 0, True = NOT False
  169. OPTION BASE 1                  'All arrays to start at 1 (not zero)
  170.  
  171. '+==========================================================================+
  172. '|                      Initialization and Intro Screen                     |
  173. '+--------------------------------------------------------------------------+
  174.  
  175. '---- Set VGA or EGA Graphic Screen.
  176. Mode% = 12
  177. ON ERROR GOTO BadMode
  178. SCREEN Mode%
  179. ON ERROR GOTO 0
  180.  
  181. y% = 335
  182. IF Mode% = 12 THEN
  183.     Vga% = 10
  184.     y% = 460
  185. END IF
  186.  
  187. VIEW SCREEN (0, 0)-(639, y%)
  188.  
  189. DEFINT A-Z                 'Default to integers for now
  190.  
  191. '---- Draw a tiled window
  192. LINE (0, 0)-(639, y%), 15, B
  193. PAINT (300, 200), 3, 15
  194.  
  195. IF Vga% THEN Vga% = 1
  196. x = 7: y = 33 + Vga%
  197.  
  198. FOR V = 1 TO 10 + (Vga% * 3)           'Loop once for each verticle tile.
  199.     FOR H = 1 TO 14                    'Loop once for each horizontal tile.
  200.         x1 = x: y1 = y
  201.         x2 = x1 + 39: y2 = y1 - 29
  202.         x3 = x1 + 40: y3 = y1 + 1 + Vga%
  203.         x4 = x1 + 41: y4 = y1 - 28
  204.         x5 = x + 1: y5 = y1 + 2 + Vga%
  205.         LINE (x1, y1)-(x1, y2), 11     'Top of tile
  206.         LINE -(x2, y2), 11             'Left side of tile
  207.         LINE (x3, y2)-(x3, y3), 0      'Right side of tile
  208.         LINE -(x1, y3), 0              'Bottom of tile
  209.         LINE (x4, y4)-(x4, y5), 0      'Column #2 of right side (extra shade)
  210.         LINE -(x5, y5), 0              'Row #2 of bottom side (extra shade)
  211.         x = x + 45
  212.     NEXT
  213.     x = 7
  214.     y = y + 33 + Vga% + Vga%
  215. NEXT
  216.  
  217. IF Vga% THEN Vga% = 10
  218.  
  219. '---- Draw the program title starting at pixel row 56
  220. ShowTitle 56
  221.  
  222. '---- Force the compiler to put "fusion" in the token table so that the
  223. '     compiled program, when listed, clearly shows the name, followed by
  224. '     the version and the copyright notice.
  225. a$ = "FUSION"
  226.  
  227. a$ = "VERSION 1.3"
  228. x% = 250: y% = 141 + Vga%: StepX% = 13: Klr% = 14: Shadow% = True
  229. PrintROMtable a$, x%, y%, StepX%, StepY%, Klr%, BG%, Shadow%
  230.  
  231. a$ = "Copyright (C) 1991, Lawrence Stone.  All Rights Reserved."
  232. x% = 119: y% = 155 + Vga%: StepX% = 7
  233. PrintROMtable a$, x%, y%, StepX%, StepY%, Klr%, BG%, Shadow%
  234.  
  235. IF Vga% THEN Vga% = Vga% + 3
  236. a$ = "Based upon an orig"
  237. x% = 144: y% = 222 + Vga%: StepX% = 10: StepY% = True: Klr% = 15
  238. PrintROMtable a$, x%, y%, StepX%, StepY%, Klr%, BG%, Shadow%
  239.  
  240. a$ = "inal algorithm by"
  241. x% = 325: y% = 206 + Vga%: StepY% = 1: Klr% = 15
  242. PrintROMtable a$, x%, y%, StepX%, StepY%, Klr%, BG%, Shadow%
  243.  
  244. a$ = "Charles Graham"
  245. x% = 263: y% = 222 + Vga%: StepX% = 8: StepY% = False
  246. PrintROMtable a$, x%, y%, StepX%, StepY%, Klr%, BG%, Shadow%
  247.  
  248. IF Vga% THEN Vga% = Vga% + 3
  249. a$ = "The William Tell Overture"
  250. x% = 143: y% = 269 + Vga%: StepX% = 7: StepY% = 1
  251. PrintROMtable a$, x%, y%, StepX%, StepY%, Klr%, BG%, Shadow%
  252.  
  253. a$ = "translated for the PC by":
  254. x% = 324: y% = 293 + Vga%: StepX% = 7: StepY% = True
  255. PrintROMtable a$, x%, y%, StepX%, StepY%, Klr%, BG%, Shadow%
  256.  
  257. a$ = "Anonymous"
  258. x% = 284: y% = 277 + Vga%: StepX% = 8: StepY% = False
  259. PrintROMtable a$, x%, y%, StepX%, StepY%, Klr%, BG%, Shadow%
  260.  
  261. DEFSNG A-Z                 'Default to single precision for now
  262.  
  263. '---- Draw the fancy orbs for the intro screen.
  264. z = .1
  265. x = 12.1001
  266. Klr% = 3
  267. FOR z% = 1 TO 120
  268.     CIRCLE (75, 90), 75, Klr%, , , z
  269.     CIRCLE (563, 90), 75, Klr%, , , x
  270.     Klr% = Klr% + 1
  271.     IF Klr% > 15 THEN Klr% = 1
  272.     z = z + .1
  273.     x = x - .1
  274. NEXT
  275.  
  276. '---- Establish some variables.
  277. On$ = "On "
  278. Off$ = "Off"
  279. F1$ = "F1: Music is "
  280. F2$ = "  F2: Spacenik Sound is "
  281. mu% = True                   'Music is on
  282. spacenik% = True             'spacenik noise is on
  283. colorWow% = 3                'Used to compute time of color change
  284. Pics2Display% = 1            'Number of pics to display at once -may become 2
  285. hold% = False                'Don't hold a screen image
  286.  
  287. '---- Start the music playing in the background.
  288. playCount% = playCount% + 2
  289. READ m$                      'Read music initialization string
  290. PLAY ON                      'Set QB's music handler on
  291. PLAY m$                      'Process the initiation string
  292. ON PLAY(3) GOSUB PlayMore    'Set music to trap when que has 3 characters
  293. READ m$                      'Read some music
  294. PLAY "MB X" + VARPTR$(m$)    'Play it from the background que.
  295.  
  296. '---- Event trap for F1, F2, F10, and spacebar and escape keys.
  297. KEY 15, CHR$(0) + CHR$(57)   'Define Spacebar as key 15
  298. KEY 16, CHR$(0) + CHR$(1)    'Define Esc key as key 16
  299. KEY(1) ON                    'F1
  300. KEY(2) ON                    'F2
  301. KEY(10) ON                   'F10
  302. KEY(15) ON
  303. KEY(16) ON
  304. ON KEY(1) GOSUB music
  305. ON KEY(2) GOSUB SpacenikNoise
  306. ON KEY(10) GOSUB ThatsAll
  307. ON KEY(15) GOSUB HoldImage
  308. ON KEY(16) GOSUB Esc
  309.  
  310. GOSUB HoldImage              'Hold everything until the user hits "Esc"
  311.  
  312. RANDOMIZE TIMER
  313. pi = 3.141593
  314. ymin = 640
  315. ymax = False
  316.  
  317. a$ = " Computing... "
  318. x% = 238: y% = 247 + Vga%: StepX% = 12: Klr% = 14: BG% = 4
  319. PrintROMtable a$, x%, y%, StepX%, StepY%, Klr%, BG%, True
  320. a$ = ""
  321.  
  322. '---- UnREM the next two lines if using PDS 7.1 (QB 4.0b can't handle it)
  323. 'DEFINT F-G, L-N, Y-Z           'Make these integers for extra speed
  324. 'DEFLNG A-B, X                  'Make these long integers for speed
  325.  
  326. '+==========================================================================+
  327. '|                                  Main Logic                              |
  328. '+--------------------------------------------------------------------------+
  329.  
  330. DO
  331.     '---- Is sound on or off?
  332.     IF mu% = True THEN PLAY ON
  333.    
  334.     displayCount% = displayCount% + 1  'Number of pictures displayed
  335.     g = INT(RND * 590) + 50         '50 - 640 possible points to each drawing
  336.     w = INT(RND * 1.9) + .1         'weighted factor used for yavg, etc.
  337.     f = INT(RND * 96) + 5           'weighted factor used for m and u below
  338.    
  339.     m = 4 * f                       'The number elements in dimension #1
  340.  
  341.     '---- t() is a "theta" factor used in calculating locations, x(), and
  342.     '     y(), as well as, used to compute the radius, r() of the equation.
  343.  
  344.     REDIM t(m)
  345.  
  346.     u = pi / 2 / f
  347.     FOR z = 1 TO m
  348.         t(z) = u * (z - 1)
  349.     NEXT
  350.    
  351.     '---- The number of 'loci'
  352.     n = INT(RND * 9) + 2           'The number elements in dimension #2
  353.  
  354.     '---- x() & y() are graphic drawing points...
  355.     '     a() & b() are semi-axis and c() is the product of a() & b()
  356.     REDIM x(m, n), y(m, n), a(n), b(n), c(n)
  357.    
  358.     '---- Initialize coordinates x() and y(); semi-axis a() and b(), their
  359.     '     product c(); and, compute ymin and ymax
  360.     FOR z = 1 TO n
  361.         x(1, z) = INT(RND * 640)
  362.         a(z) = (x(1, z) - g) * (x(1, z) - g)
  363.         b(z) = ((x(1, z) - g) * (1 - w)) * ((x(1, z) - g) * (1 - w))
  364.         c(z) = a(z) * (b(z) * 1!) '--- b()* 1! forces SINGLE to handle big num
  365.         y(1, z) = INT(RND * 350)
  366.        
  367.         IF y(1, z) < ymin THEN
  368.             ymin = y(1, z)
  369.         END IF
  370.        
  371.         IF y(1, z) > ymax THEN
  372.             ymax = y(1, z)
  373.         END IF
  374.     NEXT
  375.    
  376.     '---- Calculate yavg
  377.     yavg = CINT(((ymax - ymin) / 2) + ymin)
  378.    
  379.     '---- Scale the graphic coordinate y(1, z) to yavg
  380.     FOR z = 1 TO n
  381.         IF y(1, z) > yavg THEN
  382.             y(1, z) = CINT(yavg + (ABS(y(1, z) - yavg) * w))
  383.         ELSEIF y(1, z) < yavg THEN
  384.             y(1, z) = CINT(yavg - (ABS(y(1, z) - yavg) * w))
  385.         END IF
  386.     NEXT
  387.    
  388.     '---- Calculate the design
  389.     FOR z = 2 TO m
  390.         FOR l = 1 TO n
  391.  
  392.             '---- Set a new palette.
  393.             GOSUB NewPalette
  394.  
  395.             '---- Compute the radius of the ellipse and scale the graphic
  396.             '     coordinates y(2+, l) to this radius.  The coordinate x(2+,l)
  397.             '     is either assigned to the point or is computed using the
  398.             '     values of the radius, r, divided by the arc-cosine theta
  399.             '     subtracted from the value of the point.
  400.  
  401.             IF (x(1, l) < g) THEN
  402.                 r = SQR(c(l) / (a(l) * (SIN(t(z)) * SIN(t(z))) + (b(l) * (COS(t(z)) * COS(t(z))))))
  403.                 
  404.                 IF ((ABS(COS(t(z)))) < .000001) THEN
  405.                     x(z, l) = g
  406.                 ELSE
  407.                     x(z, l) = g - CINT(r / (1 / COS(t(z))))
  408.                 END IF
  409.  
  410.                 y(z, l) = y(1, l) + CINT(r * (SIN(t(z))))
  411.  
  412.             ELSEIF (x(1, l) > g) THEN
  413.                 r = SQR(c(l) / (a(l) * (SIN(t(z)) * SIN(t(z))) + (b(l) * (COS(t(z)) * COS(t(z))))))
  414.                 
  415.                 IF ((ABS(COS(t(z)))) < .000001) THEN
  416.                     x(z, l) = g
  417.                 ELSE
  418.                     x(z, l) = g + CINT(r / (1 / COS(t(z))))
  419.                 END IF
  420.  
  421.                 y(z, l) = y(1, l) - CINT(r * (SIN(t(z))))
  422.  
  423.             ELSE
  424.                 x(z, l) = g
  425.                 y(z, l) = y(1, l)
  426.             END IF
  427.         NEXT
  428.     NEXT
  429.  
  430.     '---- Calculate a new color to use.
  431.     last% = Klr%
  432.     WHILE last% = Klr%
  433.         Klr% = INT(RND * 16)
  434.     WEND
  435.    
  436.     '---- Do we need to clear the screen?
  437.     IF displayCount% MOD Pics2Display% = False THEN
  438.         GOSUB Klear
  439.         displayCount% = False
  440.     END IF
  441.    
  442.     '---- Stop playing and allow spacenik noise.
  443.     IF spacenik% OR NOT mu% THEN
  444.         PLAY STOP
  445.         GOSUB CountDown
  446.     END IF
  447.  
  448.     FOR z = 1 TO m
  449.  
  450.         '---- Are sounds on or off?
  451.         IF spacenik% THEN
  452.             SOUND INT(200 * RND + 40 + r + 20), 1
  453.         ELSEIF mu% AND NOT spacenik% THEN
  454.             PLAY ON
  455.         END IF
  456.        
  457.         '---- Display the design.
  458.         FOR l = 1 TO n
  459.  
  460.             '---- Circle calculations are performed at element #1 and at the
  461.             '     halfway element of dimension #2.
  462.             IF (l = 1) OR (l = n \ 2) THEN
  463.  
  464.                 '---- Calculate a divisor
  465.                 divisor = x(z, l) * RND
  466.                 IF divisor = False THEN divisor = .0001
  467.  
  468.                 '---- Calculate an aspect ratio
  469.                 aspect! = RND * ((y(z, l) * RND) / divisor)
  470.  
  471.                 '---- Calculate the end of the arc
  472.                 endArc = ABS(aspect! * RND)
  473. CalcEndArc:
  474.                 IF endArc > 6.28 THEN endArc = endArc / 10: GOTO CalcEndArc
  475.  
  476.                 '---- Calculate the start of the arc
  477.                 startArc = ABS(RND * aspect!)
  478.                 IF startArc > 6.28 THEN startArc = .0001
  479.                 IF RND * 5 > 2.5 THEN SWAP startArc, endArc
  480.  
  481.                 mCheck% = INT(RND * m) + 1
  482.  
  483.                 IF z MOD mCheck% = False THEN
  484.                     '---- Draw a "muon" trail if z MOD random number = False
  485.                     '     Note the "muon" trail is an arc with its own ellipse
  486.  
  487.                     radius% = ABS(y(z, l) * RND)
  488.                     CIRCLE (x(z, l), y(z, l)), radius%, Klr%, startArc, endArc, aspect!
  489.                 ELSE
  490.                     IF radius% THEN
  491.                         '---- Draw a "quark" trail if radius% is not zero.
  492.                         '     The "quark" trail has no aspect!
  493.  
  494.                         CIRCLE (x(z, l), y(z, l)), radius%, Klr%, startArc, endArc
  495.                     ELSE
  496.                         '---- Set a point if radius is zero.
  497.  
  498.                         CIRCLE (x(z, l), y(z, l)), radius%, Klr%
  499.                     END IF
  500.                 END IF
  501.  
  502.                 '---- Clear the radius on a weighted, random basis.
  503.                 IF RND > .85 THEN radius% = False
  504.  
  505.             '---- If not at element #1 or the halfway element of dimension #2
  506.             '     then draw one of the line types.
  507.             ELSEIF plasma% AND displayCount% MOD 2 = False THEN
  508.                 '---- Draw an "energy" line if display count is 2
  509.                 '     and "plasma%" is not zero.
  510.  
  511.                 LINE -(x(z, l), y(z, l)), Klr%
  512.             ELSEIF displayCount% MOD 2 <> False AND NOT plasma% THEN
  513.                 '---- Draw an "energy" line if display count is 1 and
  514.                 '     "plasma" is zero.
  515.                     
  516.                 LINE -(x(z, l), y(z, l)), Klr%
  517.             ELSE
  518.                 '---- Otherwise, draw an "plasma" line.
  519.                 
  520.                 LINE -(x(z, l), y(z, l)), Klr%, , INT(RND * 4096)
  521.             END IF
  522.         NEXT
  523.        
  524.         '---- Calculate a new color to use within the design.
  525.         IF z MOD colorWow% = False THEN GOSUB ChngKlr
  526.     NEXT
  527.     '---- Clear the arrays and reset radius% to zero
  528.     ERASE t, x, y, a, b, c
  529.     radius% = False
  530. LOOP
  531.  
  532. '+==========================================================================+
  533. '|                                Subroutines                               |
  534. '+--------------------------------------------------------------------------+
  535.  
  536. music:
  537.     mu% = mu% XOR True                         'Toggle Music
  538.     IF NOT mu% THEN
  539.         PLAY STOP
  540.         GOSUB CountDown
  541.     ELSE
  542.         PLAY ON
  543.         IF NOT spacenik% THEN spacenik% = True  'If music then also spacenik
  544.     END IF                                    'noises will be on.
  545.     GOSUB DisplayPrompt
  546. RETURN
  547.  
  548. SpacenikNoise:
  549.     spacenik% = spacenik% XOR True            'Toggle spacenik noises
  550.     GOSUB DisplayPrompt
  551. RETURN
  552.  
  553. Klear:                                        'Clear the screen
  554.     COLOR 0
  555.     CLS
  556.     GOSUB DisplayPrompt
  557.     GOSUB ChngKlr
  558.     
  559. SetPictureRate:
  560.     Pics2Display% = INT(RND * 3)              'Max Pics2Display% is 2
  561.     IF Pics2Display% = False GOTO SetPictureRate
  562.  
  563.     '---- Togle plasma lines
  564.     plasma% = plasma% XOR True
  565. RETURN
  566.  
  567. ChngKlr:
  568.     Klr% = INT(RND * 16)
  569.     
  570. NewColorWow:
  571.     colorWow% = INT(RND * 16)
  572.     IF colorWow% = False GOTO NewColorWow
  573. RETURN
  574.  
  575. NewPalette:
  576.     clr% = CINT(RND * 14) + 1
  577.     IF Vga% THEN
  578.         pal& = 65536 * (INT(RND * 63) + 1) + 256& * (INT(RND * 63) + 1) + (INT(RND * 63) + 1)
  579.     ELSE
  580.         pal& = INT(RND * 63) + 1
  581.     END IF
  582.     PALETTE clr%, pal&
  583. RETURN
  584.  
  585. HoldImage:
  586.     hold% = True: Cleared% = False
  587.     GOSUB DisplayPrompt
  588.     DO: LOOP UNTIL Cleared%                  'Hold image until Esc pressed
  589.     hold% = False
  590.     GOSUB DisplayPrompt
  591. RETURN
  592.  
  593. Esc:
  594.     Cleared% = True                           'Break out of HoldImage routine
  595. RETURN
  596.  
  597. DisplayPrompt:
  598.     IF Vga% THEN LOCATE 30, 1 ELSE LOCATE 25, 1
  599.     COLOR 3
  600.     IF hold% THEN PRINT "  ";
  601.     PRINT F1$;
  602.     COLOR 14
  603.     IF mu% THEN PRINT On$;  ELSE PRINT Off$;
  604.     COLOR 3: PRINT F2$;
  605.     COLOR 14
  606.     IF spacenik% THEN PRINT On$;  ELSE PRINT Off$;
  607.     COLOR 3
  608.     IF hold% = False THEN                      'If holding the image then...
  609.         PRINT "  SPACEBAR to ";
  610.         COLOR 14: PRINT "Hold Image   ";
  611.     ELSE                                       'Otherwise...
  612.         COLOR 11: PRINT "  ESC to ";
  613.         COLOR 14: PRINT "Design/Draw   ";
  614.     END IF
  615.     COLOR 3: PRINT "F10 to ";
  616.     COLOR 14: PRINT "END";
  617.     IF hold% THEN PRINT "  ";                  'If holding the image buffer line
  618. RETURN
  619.  
  620. PlayMore:
  621.     playCount% = playCount% + 1               'INC number of READs by 1
  622.     IF playCount% > 100 THEN                  'Only 100 lines to read!
  623.         PLAY STOP                             'Stop the music
  624.         RESTORE MusicData                     'Restore the music data
  625.         playCount% = 2                        'We'll be reading 2 lines
  626.         READ m$                               'Read initiation string
  627.         PLAY ON                               'Turn on PLAY
  628.         PLAY m$                               'Process initiation code
  629.     END IF
  630.     READ m$                                   'Read some music
  631.     PLAY "MB X" + VARPTR$(m$)    'Set music to trap when que has 3 characters
  632. RETURN
  633.  
  634. CountDown:
  635.     DO
  636.         NoteCount% = PLAY(0)
  637.         DO                                    'Check each DEC from que.
  638.         LOOP UNTIL NoteCount% <> PLAY(0) OR NoteCount% = False
  639.     LOOP UNTIL NoteCount% = False             'If que empty then exit loop
  640. RETURN
  641.  
  642. ThatsAll:
  643.     PLAY OFF                                  'Turn of music
  644.     GOSUB CountDown                           'Clear the music Que
  645.     IF Vga% THEN y% = 479 ELSE y% = 349
  646.     VIEW SCREEN (0, 0)-(639, y%)              'View the entire screen
  647.     PALETTE                                   'Restore palette
  648.     CLS
  649.  
  650.     a$ = "Thank you for using..."
  651.     x% = 169: y% = 115: StepX% = 14: Klr% = 11: BG% = False
  652.     PrintROMtable a$, x%, y%, StepX%, StepY%, Klr%, BG%, False
  653.  
  654.     '---- Draw the program title
  655.     ShowTitle 156
  656.  
  657.     FOR rest = 1 TO 10000: NEXT               'Hold the message for awhile
  658.  
  659.     VIEW PRINT 1 TO 25
  660.     SCREEN 0
  661.     COLOR 7, 0
  662.     CLS
  663.     END
  664.  
  665. BadMode:
  666.     z% = ERR
  667.     IF Mode% = 12 THEN                        'If VGA produced error try EGA
  668.         Mode% = 9
  669.         RESUME
  670.     END IF
  671.     SCREEN 0                                  'If EGA produced error then END
  672.     CLS
  673.     PRINT "EGA or VGA Color Monitor Required to Run FUSION"
  674.     PRINT "Program Aborted"
  675.     END
  676.  
  677. '+==========================================================================+
  678. '|                                    Data                                  |
  679. '+--------------------------------------------------------------------------+
  680.    
  681. MusicData:
  682.     DATA "mfl16t155"
  683.     DATA "o2mnb4p8msbbmnb4p8msbbb8g#8"
  684.     DATA "e8g#8b8g#8b8o3e8o2b8g#8e8g#8"
  685.     DATA "b8g#8b8o3e8o2mnb4p8msbbmnb4"
  686.     DATA "p8msbbmnb4p8msbbmnb4p8msbb"
  687.     DATA "b8bbb8b8b8bbb8b8b8bb"
  688.     DATA "b8b8b8bbb8b8mlb2b2b8p8p4p4"
  689.     DATA "p8mso1bbb8bbb8bbo2e8f#8g#8o1bb"
  690.     DATA "b8bbo2e8g#g#f#8d#8o1b8bbb8bb"
  691.     DATA "b8bbo2e8f#8g#8eg#mlb4bmsag#f#"
  692.     DATA "e8g#8e8o3bbb8bbb8bbo4e8f#8"
  693.     DATA "g#8o3bbb8bbo4e8g#g#f#8d#8o3b8bb"
  694.     DATA "b8bbb8bbo4e8f#8g#8mleg#b4"
  695.     DATA "bag#f#mse8g#8e8o3g#g#g#8g#g#g#8g#g#"
  696.     DATA "g#8o4c#8o3g#8o4c#8o3g#8o4c#8o3g#8f#8e8d#8"
  697.     DATA "c#8g#g#g#8g#g#g#8g#g#g#8o4c#8o3g#8o4c#8"
  698.     DATA "o3g#8o4c#8o3b8a#8b8a#8b8g#g#g#8g#g#"
  699.     DATA "g#8g#g#g#8o4c#8o3g#8o4c#8o3g#8o4c#8o3g#8f#8"
  700.     DATA "e8d#8c#8g#g#g#8g#g#g#8g#g#g#8o4c#8"
  701.     DATA "o3g#8o4c#8o3g#8o4c#8o3b8a#8b8o2bbb8f#f#"
  702.     DATA "f#8f#f#f#8g#8a8f#4mna8msg#8mne4"
  703.     DATA "msg#8f#8f#8f#8o3f#f#f#8f#f#f#8g#8"
  704.     DATA "a8mnf#4msa8g#8mne4msg#8f#8o2bb"
  705.     DATA "b8o1bbb8bbb8bbo2mne8f#8g#8o1bb"
  706.     DATA "b8bbo2e8g#g#f#8d#8o1b8bbb8bb"
  707.     DATA "b8bbo2e8f#8g#8eg#mlb4mnbag#f#"
  708.     DATA "e8g#8e8o3bbb8bbb8bbo4e8f#8"
  709.     DATA "g#8o3bbb8bbo4e8g#g#f#8d#8o3b8bb"
  710.     DATA "b8bbb8bbo4e8f#8g#8mleg#mlb4"
  711.     DATA "mnbag#f#mne8g#8e8o3mle56f56g56a56b56o4c56d56mne8eee8e8mlg#4g#8"
  712.     DATA "mnf#8e8d#8e8c#8mso3bo4c#o3bo4c#o3b"
  713.     DATA "o4c#d#eo3abababo4c#d#o3g#ag#ag#abo4c#o3f#"
  714.     DATA "g#f#g#f#g#f#g#f#g#f#d#o2bo3mlbo4c#d#e8d#8e8"
  715.     DATA "c#8o3msbo4c#o3bo4c#o3bo4c#d#eo3abababo4c#d#o3g#"
  716.     DATA "ag#ag#abo4c#o3f#g#f#g#f#af#emne8p8mlc#4"
  717.     DATA "mnc#o2cmso3c#o2co3d#c#o2baag#ec#c#c#c#c#e"
  718.     DATA "d#o1cg#g#g#g#g#g#o2c#eg#o3c#c#c#c#c#o2co3c#o2co3d#"
  719.     DATA "c#o2baag#ec#c#c#c#c#ed#o1cg#g#g#g#g#mng#"
  720.     DATA "o2c#eg#o3msc#ed#c#d#o2cg#g#g#o3g#ec#d#o2cg#g#g#"
  721.     DATA "o3g#ec#d#o2bg#g#a#gd#d#g#gg#gg#ag#f#e"
  722.     DATA "o1ba#bo2eo1bo2f#o1bo2g#ed#eg#eaf#bo3g#f#ed#"
  723.     DATA "f#ec#o2bo3c#o2bo3c#d#ef#g#o2ababo3c#d#ef#o2g#"
  724.     DATA "ag#aco3c#d#eo2f#g#f#g#f#g#f#g#f#g#f#d#o1b"
  725.     DATA "co2c#d#eo1ba#bo2eo1bo2f#o1bo2g#ed#eg#eaf#b"
  726.     DATA "o3g#f#ed#f#ec#o2bo3c#o2bo3c#d#ef#g#o2ababo3c#"
  727.     DATA "d#ef#o2g#ag#abo3c#d#eo2f#o3c#o2co3c#d#c#o2af#mne"
  728.     DATA "o3mlef#g#abo4c#d#mne8mseee8e8mlg#4g#8"
  729.     DATA "msf#8mse8d#8e8c#8o3bo4c#o3bo4c#o3bo4c#d#eo3a"
  730.     DATA "bababo4c#d#o3g#ag#ag#abo4c#o3f#g#f#g#f#"
  731.     DATA "g#f#g#f#g#f#d#o2bo3mlbo4c#d#mne8eee8e8mlg#4g#8"
  732.     DATA "msf#8e8d#8e8c#8o3bo4c#o3bo4c#o3b"
  733.     DATA "o4c#d#eo3abababo4c#d#o3g#ag#ag#abo4c#o3f#"
  734.     DATA "g#f#g#f#ag#f#e8o2b8o3e8g#g#g#8mng#g#g#8"
  735.     DATA "g#g#g#8o4c#8o3g#8o4c#8o3g#8o4c#8o3g#8f#8e8"
  736.     DATA "d#8c#8g#g#g#8g#g#g#8g#g#g#8o4c#8o3g#8"
  737.     DATA "o4c#8o3g#8o4c#8o3b8a#8b8a#8b8g#g#g#8"
  738.     DATA "g#g#g#8g#g#g#8o4c#8o3g#8o4c#8o3g#8o4c#8o3g#8"
  739.     DATA "f#8e8d#8c#8g#g#g#8g#g#g#8g#g#g#8"
  740.     DATA "o4c#8o3g#8o4c#8o3g#8o4c#8o3b8a#8b8a#8b8"
  741.     DATA "o2f#f#f#8f#f#f#8g#8a8f#4a8g#8"
  742.     DATA "e4g#8f#8o0b8o1b8o2f#f#f#8f#f#f#8"
  743.     DATA "g#8a8f#4a8g#8e4g#8f#8"
  744.     DATA "bbb8o1bbb8bbb8bbo2e8f#8g#8"
  745.     DATA "o1bbb8bbo2e8g#g#f#8d#8o1b8bbb8"
  746.     DATA "bbb8bbo2e8f#8g#8eg#mlb4mnb"
  747.     DATA "ag#f#e8o1b8o2e8o3bbb8bbb8bbo4e8"
  748.     DATA "f#8g#8o3bbb8bbo4e8g#g#f#8d#8o3b8"
  749.     DATA "bbb8bbb8bbo4e8f#8g#8o3eg#mlb4"
  750.     DATA "mnbag#f#mlef#g#mnamlg#abo4mnc#mlo3bo4c#d#mnemld#"
  751.     DATA "ef#mng#ao3bo4ao3bo4ao3bo4ao3bo4ao3bo4ao3bo4ao3bo4ao3bmle"
  752.     DATA "f#g#mnamlg#abmno4c#mlo3bo4c#d#mnemld#ef#mng#ao3bo4ao3bo4a"
  753.     DATA "o3bo4ao3bo4ao3bo4ao3bo4ao3bo4ao3bp16mlg#o4g#o3mng#p16mld#o4d#o3mnd#p16"
  754.     DATA "mleo4eo3mnep16mlao4ao3mnap16mlg#o4g#o3mng#p16mld#o4d#o3mnd#p16mleo4eo3mnep16"
  755.     DATA "mlao4ao3mnao4go3go4go3go4go3go4go3go4msg8e8c8e8o4mng#"
  756.     DATA "o3g#o4g#o3g#o4g#o3g#o4g#o3g#o4msg#8e8o3b8o4e8mng#o3g#o4g#o3g#o4g#"
  757.     DATA "o3g#o4g#o3g#o4msg#8f8c#8f8mna#o3a#o4a#o3a#o4a#o3a#o4a#o3a#o4msa#8"
  758.     DATA "g8e8g8b8p16mna#p16ap16g#p16f#p16ep16"
  759.     DATA "d#p16c#p16o3bp16a#p16ap16g#p16f#p16ep16d#p16f#mle"
  760.     DATA "f#g#mnamlg#abmno4c#o3mlbo4c#d#mnemld#ef#mng#ao3bo4ao3bo4a"
  761.     DATA "o3bo4ao3bo4ao3bo4ao3bo4ao3bo4ao3bmlef#g#mnamlg#abmno4c#o3mlb"
  762.     DATA "o4c#d#mnemld#ef#mng#ao3bo4ao3bo4ao3bo4ao3bo4ao3bo4ao3bo4a"
  763.     DATA "o3bo4ao3bp16mlg#o4g#o3mng#p16mld#o4d#o3mnd#p16mleo4eo3mnep16mlao4ao3mnap16"
  764.     DATA "mlg#o4g#o3mng#p16mld#o4d#o3mnd#p16mleo4eo3mnep16mlao4ao3mnao4go3go4go3go4g"
  765.     DATA "o3go4go3go4g8e8c8e8g#o3g#o4g#o3g#o4g#o3g#o4g#o3g#o4g#8"
  766.     DATA "e8o3b8o4e8g#o3g#o4g#o3g#o4g#o3g#o4g#o3g#o4msg#8mnf8c#8"
  767.     DATA "f8a#o3a#o4a#o3a#o4a#o3a#o4a#o3a#o4a#8g8e8g8b8"
  768.     DATA "p16a#p16ap16g#p16f#p16ep16d#p16c#p16o3bp16a#p16"
  769.     DATA "ap16g#p16f#p16ep16d#p16fmled#ed#mne8bbb8"
  770.     DATA "bbb8bbo4e8f#8g#8o3bbb8bbb8"
  771.     DATA "bbo4g#8a8b8p8e8f#8g#8p8o3g#8"
  772.     DATA "a8b8p8p2o2bco3c#dd#"
  773.     DATA "eff#gg#aa#bco4c#d#ed#f#d#ed#f#d#e"
  774.     DATA "d#f#d#ed#f#d#ed#f#d#ed#f#d#ed#f#d#e"
  775.     DATA "d#f#d#e8eo3eo4eo3eo4eo3eo4e8o3bo2bo3bo2bo3bo2bo3b8"
  776.     DATA "g#o2g#o3g#o2g#o3g#o2g#o3g8eo2eo3eo2eo3eo2eo3e8eee8"
  777.     DATA "e8e8o2bbb8b8b8g#g#g#8g#8g#8"
  778.     DATA "eee8e8e8o1b8o2e8o1b8o2g#8e8b8"
  779.     DATA "g#8o3e8o2b8o3e8o2b8o3g#8e8b8g#8o4e4"
  780.     DATA "p8eee8e8e8e8e4p8p16"
  781.     DATA "ee4p8p16o2ee2"
  782.  
  783. ProgTitle:
  784.     DATA 8, 163, 196, 208, 208, 255, 255, 283, 316, 343, 343, 369, 398, 424, 438, 487, 487
  785.     DATA 8, 159, 198, 208, 208, 255, 255, 279, 318, 343, 343, 367, 400, 424, 439, 487, 487
  786.     DATA 8, 156, 198, 208, 209, 254, 255, 276, 318, 342, 343, 365, 402, 424, 440, 486, 487
  787.     DATA 8, 155, 199, 208, 210, 253, 255, 275, 319, 341, 343, 364, 403, 424, 440, 485, 487
  788.     DATA 8, 154, 198, 208, 212, 252, 255, 274, 318, 340, 343, 363, 404, 424, 441, 484, 487
  789.     DATA 8, 153, 198, 208, 214, 250, 255, 273, 318, 338, 343, 362, 405, 424, 442, 482, 487
  790.     DATA 8, 153, 196, 208, 215, 249, 255, 273, 316, 337, 343, 361, 406, 424, 442, 481, 487
  791.     DATA 9, 152, 167, 208, 215, 248, 255, 272, 287, 336, 343, 360, 375, 391, 407, 424, 443, 480, 487
  792.     DATA 9, 152, 164, 208, 215, 248, 255, 272, 284, 336, 343, 360, 373, 393, 407, 424, 443, 480, 487
  793.     DATA 9, 152, 162, 208, 215, 248, 255, 272, 282, 336, 343, 360, 372, 394, 407, 424, 444, 480, 487
  794.     DATA 9, 152, 161, 208, 215, 248, 255, 272, 281, 336, 343, 360, 371, 396, 407, 424, 444, 480, 487
  795.     DATA 9, 152, 161, 208, 215, 248, 255, 272, 281, 336, 343, 360, 370, 398, 407, 424, 445, 480, 487
  796.     DATA 10, 152, 160, 208, 215, 248, 255, 272, 280, 336, 343, 360, 369, 398, 407, 424, 431, 433, 446, 480, 487
  797.     DATA 10, 152, 160, 208, 215, 248, 255, 272, 280, 336, 343, 360, 368, 399, 407, 424, 431, 433, 446, 480, 487
  798.     DATA 10, 152, 159, 208, 215, 248, 255, 272, 279, 336, 343, 360, 368, 399, 407, 424, 431, 434, 447, 480, 487
  799.     DATA 10, 152, 159, 208, 215, 248, 255, 272, 279, 336, 343, 360, 367, 400, 407, 424, 431, 434, 448, 480, 487
  800.     DATA 10, 152, 159, 208, 215, 248, 255, 272, 279, 336, 343, 360, 367, 400, 407, 424, 431, 435, 448, 480, 487
  801.     DATA 10, 152, 159, 208, 215, 248, 255, 272, 279, 336, 343, 360, 367, 400, 407, 424, 431, 435, 449, 480, 487
  802.     DATA 10, 152, 159, 208, 215, 248, 255, 272, 279, 336, 343, 360, 367, 400, 407, 424, 431, 436, 450, 480, 487
  803.     DATA 10, 152, 159, 208, 215, 248, 255, 272, 279, 336, 343, 360, 367, 400, 407, 424, 431, 437, 451, 480, 487
  804.     DATA 10, 152, 159, 208, 215, 248, 255, 272, 279, 336, 343, 360, 367, 400, 407, 424, 431, 437, 451, 480, 487
  805.     DATA 10, 152, 159, 208, 215, 248, 255, 272, 279, 336, 343, 360, 367, 400, 407, 424, 431, 438, 452, 480, 487
  806.     DATA 10, 152, 159, 208, 215, 248, 255, 272, 279, 336, 343, 360, 367, 400, 407, 424, 431, 439, 453, 480, 487
  807.     DATA 10, 152, 159, 208, 215, 248, 255, 272, 280, 336, 343, 360, 367, 400, 407, 424, 431, 439, 453, 480, 487
  808.     DATA 10, 152, 160, 208, 215, 248, 255, 272, 281, 336, 343, 360, 367, 400, 407, 424, 431, 440, 454, 480, 487
  809.     DATA 10, 152, 160, 208, 215, 248, 255, 272, 281, 336, 343, 360, 367, 400, 407, 424, 431, 441, 455, 480, 487
  810.     DATA 10, 152, 162, 208, 215, 248, 255, 272, 283, 336, 343, 360, 367, 400, 407, 424, 431, 441, 455, 480, 487
  811.     DATA 10, 152, 165, 208, 215, 248, 255, 272, 285, 336, 343, 360, 367, 400, 407, 424, 431, 442, 456, 480, 487
  812.     DATA 10, 152, 180, 208, 215, 248, 255, 272, 309, 336, 343, 360, 367, 400, 407, 424, 431, 442, 457, 480, 487
  813.     DATA 10, 152, 182, 208, 215, 248, 255, 273, 312, 336, 343, 360, 367, 400, 407, 424, 431, 443, 458, 480, 487
  814.     DATA 10, 152, 182, 208, 215, 248, 255, 274, 313, 336, 343, 360, 367, 400, 407, 424, 431, 444, 459, 480, 487
  815.     DATA 10, 152, 183, 208, 215, 248, 255, 275, 315, 336, 343, 360, 367, 400, 407, 424, 431, 445, 460, 480, 487
  816.     DATA 10, 152, 182, 208, 215, 248, 255, 276, 316, 336, 343, 360, 367, 400, 407, 424, 431, 446, 461, 480, 487
  817.     DATA 10, 152, 182, 208, 215, 248, 255, 279, 317, 336, 343, 360, 367, 400, 407, 424, 431, 446, 461, 480, 487
  818.     DATA 10, 152, 180, 208, 215, 248, 255, 281, 317, 336, 343, 360, 367, 400, 407, 424, 431, 447, 462, 480, 487
  819.     DATA 10, 152, 165, 208, 215, 248, 255, 302, 318, 336, 343, 360, 367, 400, 407, 424, 431, 448, 463, 480, 487
  820.     DATA 10, 152, 162, 208, 215, 248, 255, 305, 318, 336, 343, 360, 367, 400, 407, 424, 431, 448, 463, 480, 487
  821.     DATA 10, 152, 160, 208, 215, 248, 255, 307, 319, 336, 343, 360, 367, 400, 407, 424, 431, 449, 464, 480, 487
  822.     DATA 10, 152, 160, 208, 215, 248, 255, 309, 319, 336, 343, 360, 367, 400, 407, 424, 431, 450, 465, 480, 487
  823.     DATA 10, 152, 159, 208, 215, 248, 255, 310, 319, 336, 343, 360, 367, 400, 407, 424, 431, 451, 466, 480, 487
  824.     DATA 10, 152, 159, 208, 215, 248, 255, 311, 319, 336, 343, 360, 367, 400, 407, 424, 431, 451, 466, 480, 487
  825.     DATA 10, 152, 159, 208, 215, 248, 255, 311, 319, 336, 343, 360, 367, 400, 407, 424, 431, 452, 467, 480, 487
  826.     DATA 10, 152, 159, 208, 215, 248, 255, 312, 319, 336, 343, 360, 367, 400, 407, 424, 431, 453, 468, 480, 487
  827.     DATA 10, 152, 159, 208, 215, 248, 255, 312, 319, 336, 343, 360, 367, 400, 407, 424, 431, 454, 469, 480, 487
  828.     DATA 10, 152, 159, 208, 215, 248, 255, 312, 319, 336, 343, 360, 367, 400, 407, 424, 431, 454, 469, 480, 487
  829.     DATA 10, 152, 159, 208, 215, 248, 255, 312, 319, 336, 343, 360, 367, 400, 407, 424, 431, 455, 470, 480, 487
  830.     DATA 10, 152, 159, 208, 215, 248, 255, 312, 319, 336, 343, 360, 367, 400, 407, 424, 431, 455, 470, 480, 487
  831.     DATA 10, 152, 159, 208, 215, 248, 255, 312, 319, 336, 343, 360, 367, 400, 407, 424, 431, 456, 471, 480, 487
  832.     DATA 10, 152, 159, 208, 215, 248, 255, 312, 319, 336, 343, 360, 367, 400, 407, 424, 431, 457, 472, 480, 487
  833.     DATA 10, 152, 159, 208, 215, 248, 255, 312, 319, 336, 343, 360, 367, 400, 407, 424, 431, 458, 473, 480, 487
  834.     DATA 10, 152, 159, 208, 215, 248, 255, 312, 319, 336, 343, 360, 367, 400, 407, 424, 431, 458, 473, 480, 487
  835.     DATA 10, 152, 159, 208, 215, 248, 255, 312, 319, 336, 343, 360, 367, 400, 407, 424, 431, 459, 474, 480, 487
  836.     DATA 10, 152, 159, 208, 215, 248, 255, 312, 319, 336, 343, 360, 367, 400, 407, 424, 431, 460, 475, 480, 487
  837.     DATA 10, 152, 159, 208, 215, 248, 255, 312, 319, 336, 343, 360, 367, 400, 407, 424, 431, 461, 476, 480, 487
  838.     DATA 10, 152, 159, 208, 215, 248, 255, 312, 319, 336, 343, 360, 367, 400, 407, 424, 431, 461, 476, 480, 487
  839.     DATA 10, 152, 159, 208, 215, 248, 255, 312, 319, 336, 343, 360, 368, 399, 407, 424, 431, 462, 477, 480, 487
  840.     DATA 10, 152, 159, 208, 215, 248, 255, 312, 319, 336, 343, 360, 368, 399, 407, 424, 431, 462, 477, 480, 487
  841.     DATA 10, 152, 159, 208, 215, 248, 255, 312, 319, 336, 343, 360, 368, 399, 407, 424, 431, 463, 477, 480, 487
  842.     DATA 10, 152, 159, 208, 216, 247, 255, 275, 280, 311, 319, 336, 343, 360, 369, 398, 407, 424, 431, 463, 487
  843.     DATA 10, 152, 159, 208, 216, 247, 255, 274, 281, 311, 319, 336, 343, 360, 370, 398, 407, 424, 431, 464, 487
  844.     DATA 10, 152, 159, 208, 218, 245, 255, 273, 282, 309, 319, 336, 343, 360, 371, 396, 407, 424, 431, 465, 487
  845.     DATA 10, 152, 159, 208, 220, 243, 255, 273, 284, 307, 319, 336, 343, 360, 372, 394, 407, 424, 431, 466, 487
  846.     DATA 10, 152, 159, 208, 221, 242, 255, 273, 285, 306, 319, 336, 343, 360, 373, 393, 407, 424, 431, 466, 487
  847.     DATA 10, 152, 159, 209, 223, 240, 254, 273, 287, 304, 319, 336, 343, 360, 375, 391, 407, 424, 431, 467, 487
  848.     DATA 7, 152, 159, 209, 254, 273, 319, 336, 343, 361, 406, 424, 431, 468, 487
  849.     DATA 7, 152, 159, 211, 252, 274, 319, 336, 342, 362, 405, 424, 431, 469, 487
  850.     DATA 7, 152, 158, 212, 251, 275, 318, 336, 340, 363, 404, 424, 430, 469, 487
  851.     DATA 7, 152, 156, 213, 250, 276, 317, 336, 338, 364, 403, 424, 428, 470, 487
  852.     DATA 7, 152, 154, 214, 249, 277, 316, 336, 338, 365, 402, 424, 426, 470, 487
  853.     DATA 7, 152, 153, 216, 247, 279, 314, 336, 337, 367, 400, 424, 425, 471, 487
  854.     DATA 7, 152, 152, 218, 245, 281, 312, 336, 336, 369, 398, 424, 424, 472, 487
  855.  
  856. '+==========================================================================+
  857. '|                        Subprograms and Functions                         |
  858. '+--------------------------------------------------------------------------+
  859.  
  860. SUB PrintROMtable (a$, x%, y%, StepX%, StepY%, CO%, BackGround%, Shadow%)
  861.  
  862.     '+======================================================================+
  863.     '|                       PrintROMtable Subroutine                       |
  864.     '|                                                                      |
  865.     '|  INP:  a$      String of characters to print.                        |
  866.     '|        x%      Starting column, in pixel points.                     |
  867.     '|        y%      Starting row in pixel points.                         |
  868.     '|        StepX%  Count from 1st dot of character, right/left # pixels. |
  869.     '|                Example: 8 = 8 right; -8 = 8 left (prints reverse).   |
  870.     '|        StepY%  Count from 1st dot of character, down/up # pixels.    |
  871.     '|                Example: 1 = 1 down; -8 = 8 up (prints bottom - up).  |
  872.     '|        CO%     The color to make each character.                     |
  873.     '|        BackGround%  Non-zero values determine the background color   |
  874.     '|                for the string.  Background is unchanged with "0".    |
  875.     '|                (Refer to "Note".)                                    |
  876.     '|        Shadow% True or false Boolian variable.                       |
  877.     '|                                                                      |
  878.     '|  OUT:  1) String of characters printed to the graphics screen.       |
  879.     '|        2) Location and slant of displayed string are pixel based.    |
  880.     '|        3) Characters can have both foreground and background colors. |
  881.     '|        4) Characters can optionally be printed with a shadow.        |
  882.     '|                                                                      |
  883.     '|  Note: Background% = 256 for color zero; 0 for no background change. |
  884.     '+----------------------------------------------------------------------+
  885.  
  886.     '---- Don't destroy StepX and StepY.
  887.     extX% = StepX%: extY% = StepY%
  888.  
  889.     DEF SEG = &HFFA6        'ROM segment for character shape tables
  890.     FOR i% = 1 TO LEN(a$)
  891.         addr% = 8 * ASC(MID$(a$, i%)) + 14     'Address character shape table
  892.  
  893.         IF BackGround% THEN                    'Color background
  894.             '---- Backgrounds equal to 256 are really color zero.
  895.             IF BackGround% = 256 THEN BG% = False ELSE BG% = BackGround%
  896.  
  897.             '---- Prevent coloring background beyond range of string.
  898.             IF i% = LEN(a$) THEN extX% = False: extY% = False
  899.  
  900.             '---- Box and paint a background for the character.
  901.             LINE (x%, y%)-(x% + 7 + extX%, y% + 7 + extY%), BG%, BF
  902.         END IF
  903.         
  904.         FOR j% = 0 TO 7
  905.             '---- Peek 1 scan line from the table at a time, then shift bits
  906.             '     left 8 places
  907.             mask% = PEEK(addr% + j%) * 128
  908.  
  909.             '---- If shadow then displace line by 2 pixels and draw with
  910.             '     black style mask
  911.             IF Shadow% THEN
  912.                 LINE (x% + 9, y% + j% + 2)-(x% + 2, y% + j% + 2), 0, , mask%
  913.             END IF
  914.  
  915.             '---- Draw the masked line with the assigned color attribute
  916.             LINE (x% + 7, y% + j%)-(x%, y% + j%), CO%, , mask%
  917.         NEXT
  918.  
  919.         '---- INC x% and y% by values extX% and extY%
  920.         x% = x% + extX%
  921.         y% = y% + extY%
  922.     NEXT
  923.     DEF SEG                 'Return to BASIC DGROUP
  924.  
  925. END SUB
  926.  
  927. SUB ShowTitle (BeginLine%)
  928.  
  929.     RESTORE ProgTitle                          'Restore the music data
  930.     FOR y% = BeginLine% TO BeginLine% + 69     'Loop 70 times
  931.         READ z%                                'How many line to draw
  932.         FOR b% = 1 TO z%                       'Loop that many times
  933.             READ x%, x1%                       'Read start & end coordinates
  934.             FOR c% = 1 TO 2                    'Loop and draw each line twice
  935.                 IF c% = 1 THEN                 'Loop #1 draws a solid line
  936.                     mask% = &HFFFF  'Turns mask% off
  937.                     Klr% = 14
  938.                 ELSE
  939.                     '---- Stripe it by redrawing with style mask
  940.                     mask% = 521
  941.                     Klr% = 9
  942.                 END IF
  943.                 LINE (x%, y%)-(x1%, y%), Klr%, , mask%
  944.             NEXT
  945.             '---- Shadow the lines.
  946.             LINE (x% + 3, y% + 3)-(x1% + 3, y% + 3), 0
  947.         NEXT
  948.     NEXT
  949.     RESTORE MusicData                          'Restore ALL data
  950.  
  951. END SUB
  952.  
  953.